<?php

/**
 * DES加密
 * @param string $key 公告秘钥
 * @param string $input 需要加密字符串
 * @return string
 */
function desEncrypt($key, $input) {
    // pkcs5填充
    $pad = 8 - (strlen($input) % 8);
    if (0 == $pad) {
        $pad = 8;
    }
    $input = $input . str_repeat(chr($pad), $pad);
    // 加密
    $decrypted = mcrypt_ecb(MCRYPT_TRIPLEDES, $key, $input, MCRYPT_ENCRYPT);
    return $decrypted;
}

/**
 * DES解密
 * @param string $key 公告秘钥
 * @param 需要解密字符串 $input
 * @return null|string
 */
function desDecrypt($key, $input) {
    // 判断是否为8的倍数
    $len = strlen($input);
    if ($len < 16 || $len % 8 != 0) {
        return null;
    }
    // 解密
    $decrypted = mcrypt_ecb(MCRYPT_TRIPLEDES, $key, $input, MCRYPT_DECRYPT);
    // pkcs5反解
    $pad = ord($decrypted{$len - 1});
    if ($pad > $len) {
        return $decrypted;
    }
    if (strspn($decrypted, chr($pad), $len - $pad) != $pad) {
        return $decrypted;
    }
    // 返加
    return substr($decrypted, 0, -1 * $pad);
}